ラズパイとRAID 0(HDD編)

2024年7月10日 追記
2024年7月8日 記

はじめに

今、私が使っているNAS(2TB)より大きめの自作NAS(12TB)を作ろうと思い、その制作過程の記録兼備忘録になります。 以前ラズパイ5+USB SSD 1TB×2個を使ってRAID 0構成のストレージを作ったのですが、それのSATA HDD版になります。 以前作ったRAID 0 SSDストレージですが、HDD版を構成しているうちにいくつかの問題(不具合?)などに気付いたこともありますので、少し異なるところもあります。 なので、是非ご覧くださいね。




目次

(1)ハードウェア構成
(2)パーティション解放&確保
(3)RAID 0作成
(4)ファイルシステムを構築(フォーマット)する
(5)HDD デバイス名を固定する
(6)RAID 0デバイスをマウント
(7)キャッシュ設定
(8)RAID 0デバイスでI/Oエラーが発生したときの対処方法
(9)自分のホームディレクトリへシンボリックリンク
(10)最後に







(1)ハードウェア構成

ハードウェア構成として、 ラズパイ5のUSB3.0ポートにUSB3.2Gen2ハブ(セルフパワー)を2個付けて、そこへ起動用SSD、 RAID 0用HDD(6TB)を2個を取り付けました。

[ラズパイ5] -+- [USB3.2Gen2 Hub] -+- [起動用SSD(USB3.2Gen2 512KB)]
             |                    |
             |                    +- [USB3.0 - SATA(12V電源ポート付き)変換アダプタ] --- [SATA 6TB HDD]
             |
             +- [USB3.2Gen2 Hub] --- [USB3.0 - SATA(12V電源ポート付き)変換アダプタ] --- [SATA 6TB HDD]


ハードウェアの注意点としては、USBハブは【高速動作するもの】を選択しましょう。 これはカタログスペックからだと分からないかもしれません。 【実際に取り付けてベンチマークテストしてみたら遅かった】などということもありますので。

それとパーツ類(HDD、USBハブ、USB-SATA変換アダプタ、接続ケーブルとケーブル長など)は、できるだけ同じもを使うようにしましょう。 それぞれが異なってしまうと信号の伝達時間が異なってしまって結果的に思ったほどのパフォーマンスが出なかった・・・、 などということになってしまうかもしれませんので。

自作の場合には、結果として自分がその動作速度に満足できればいいわけですけどね。

それと関係ないですが、ラズパイ5にサウンドカードを載せています。 サウンドプレーヤーとして別個にラズパイ5を用意する予定なのですが、 そのバックアップ用として余っていたサウンドカードを取り付けることにしました(本当に関係ないですね)。




目次へ




(2)パーティション解放&確保

今回は6TBのHDDを2台用います。 6TBだとパーディション解放&確保にfdiskコマンドを使うことはできませんのでgdiskコマンドを用いることにします。

まずは、fdiskコマンドで6TB HDDのデバイスファイルを確認します。

※以下はfdisk -lを実行した結果のHDDに関する部分を抜粋したものです。
$ sudo su		スーパーユーザー(root)へ移行
# fdisk -l

	・・・・・・

Disk /dev/sda: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: 003-2U9186
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 90F86802-68C1-42DA-93E6-90B396D738EC

Device     Start         End     Sectors  Size Type
/dev/sda1   2048 11721043967 11721041920  5.5T Linux RAID


Disk /dev/sdb: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: 003-2U9186
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 4A868FD2-29BD-4390-8DEC-21E0EE0987FF

Device     Start         End     Sectors  Size Type
/dev/sdb1   2048 11721043967 11721041920  5.5T Linux RAID

	・・・・・・



続いてパーディションの解放と確保です。
ひとつめのHDD /dev/sda に対して行います。

# gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.9

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.

Command (? for help): p		【p】コマンドで情報取得
Disk /dev/sda: 11721045168 sectors, 5.5 TiB
Model: 003-2U9186
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 2ABC2CF4-9105-4FBD-B6F5-E99C2B315761
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 11721045134
Partitions will be aligned on 2048-sector boundaries
Total free space is 11721045101 sectors (5.5 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help):d		【d】コマンドでパーティション削除
No partitions			[No partitions]が表示されるまで【d】コマンドを繰り返し実行します。

Command (? for help): n		【n】コマンドで(Linux RAID)パーティションを作成
Partition number (1-128, default 1): 1		【1】を入力
First sector (34-11721045134, default = 2048) or {+-}size{KMGTP}:		【Enter】キーを押す
Last sector (2048-11721045134, default = 11721043967) or {+-}size{KMGTP}:	【Enter】キーを押す
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Hex code or GUID (L to show codes, Enter = 8300): L
Type search string, or  to show all codes: raid
8503 Container Linux root on RAID        a505 FreeBSD Vinum/RAID
a906 NetBSD RAID                         af01 Apple RAID
af02 Apple RAID offline                  af06 Apple SoftRAID Status
af07 Apple SoftRAID Scratch              af08 Apple SoftRAID Volume
af09 Apple SoftRAID Cache                fd00 Linux RAID
Hex code or GUID (L to show codes, Enter = 8300): fd00		【fd00】を入力し、'Linux RAID'を選択
Changed type of partition to 'Linux RAID'

Command (? for help):
Command (? for help): p		【p】コマンドでパーティションの状態を再確認!
Disk /dev/sda: 11721045168 sectors, 5.5 TiB
Model: 003-2U9186
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 2ABC2CF4-9105-4FBD-B6F5-E99C2B315761
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 11721045134
Partitions will be aligned on 2048-sector boundaries
Total free space is 3181 sectors (1.6 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048     11721043967   5.5 TiB     FD00  Linux RAID

Command (? for help):
Command (? for help): w		【w】で保存(コマンド実行)

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y		【y】を入力してパーディション処理を実行します。
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
root@raspi5-2:/home/muroi#


同じことをもうひとつのHDD /dev/sdb にも実行してください。
続いて下記コマンドを実行して mdadm をインストールします。

# apt install mdadm


気になるようでしたら、ここで再起動しましょう。
これ以降はRAID 0ドライブをマウントするまで一気に行きます。

再起動する場合には下記コマンドを実行しましょう。

# reboot


ちなみにですが、RAID 0ドライブを構成するのに失敗したりして再度実行する場合には、ここで再起動することをお勧めします。 再起動後に /dev/md0 が出来上がってしまっているような場合には、HDDを完全消去する必要があると思われます。

【完全消去】といっても、前のRAID 0を構成するために必要だった情報が消去されればよいわけなので、その辺の判断はご自身で行ってください。 ちなみにですが、私はターミナルを2つ開いて下記コマンドをHDD2台に対して同時に実行し、1日半くらい待ったのですが6TB分を消去できませんでした。 ただ1日半くらいで強制停止(CTRL+C)してみたら停止したので、その状態で再構成してみたら以前のデータは消えていたようでした。

■ターミナル1で実行したHDD(/dev/sda)消去コマンド

# dd if=/dev/zero of=/dev/sda

■ターミナル2で実行したHDD(/dev/sdb)消去コマンド

# dd if=/dev/zero of=/dev/sdb




目次へ




(3)RAID 0作成

ではRAID 0を作成します。
下記コマンドを実行します。

# mdadm --create /dev/md0 --level=0 --raid-devices=2 --chunk=32 /dev/sda1 /dev/sdb1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@raspi5-2:/home/muroi#
mdadm(上記コマンド)のオプションスイッチは以下のような意味になります。
  --level=0		RAID 0を作成します。
  --raid-devices=2	2台のHDD(device)を使用することを指示します。
  --chunk=32		普通のHDDの「セクタ」や「クラスタ」となどと同様の、RAID 0保存領域の最小単位のようです。
    			32を指定していますので、書き込み最小単位は32(KB)になります。
  /dev/sda1, /dev/sdb1	RAID 0を構成するデバイス


上記コマンドを実行してRAID 0を作成できたら下記コマンドで確認してみましょう。
下のような感じになっていれば成功です。

# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 sdb1[1] sda1[0]
      11720777728 blocks super 1.2 32k chunks


次に、再起動したときにも常にRAID 0ドライブが構成されるように、 またRAID 0ドライブの構成が壊れてしまったときでも比較的簡単に再構成できるように設定します。

まずは下記コマンドを実行してください。
/etc/mdadm/mdadm.conf ファイルに情報を書き込むコマンドです。

# mdadm --detail --scan >> /etc/mdadm/mdadm.conf


次に /etc/mdadm/mdadm.conf を開くなどして最下部が下のような感じになっているのを確認しましょう。

# cat /etc/mdadm/mdadm.conf

	・・・・・ (省略) ・・・・・

# definitions of existing MD arrays

# This configuration was auto-generated on Fri, 05 Jul 2024 22:05:54 +0900 by mkconf
ARRAY /dev/md0 metadata=1.2 name=raspi5-2:0 UUID=12f6624c:b3564e19:25d2eb52:10b7f7e8


下をご覧ください。

もし下記の2行目のように【最下行と同じような内容の行】があるときには 以前構成したRAIDドライブの情報がHDDに残っているときなので、HDDを完全消去して更にmdadmをアンインストールしたのち、 最初(HDDドライブのパーティション解放&確保)から始めましょう。 古い情報がHDD上に残っているままで以降の作業を行っても不具合が出る可能性が高いです。 失敗したくなければHDDを完全消去しましょう。

# definitions of existing MD arrays
ARRAY /dev/md/0  metadata=1.2 UUID=23265c18:38bcb155:f5cf6995:a5bbffc3 name=raspi5-2:0	← 2行目(古い情報)

# This configuration was auto-generated on Thu, 04 Jul 2024 02:31:46 +0900 by mkconf
ARRAY /dev/md0 metadata=1.2 name=raspi5-2:0 UUID=1a0dc147:ff8921dd:bae6b820:0c0d45f6


更にもう1行(コメント行を含めると2行) /etc/mdadm/mdadm.conf ファイルの最後尾に追加します。

# 下の行はRAID 0ドライブが壊れたときに、自動で再構成させるためのものです。
POLICY action=re-add


下記コマンドを実行すると再起動したときに /dev/md0 が常に構成したRAID 0ドライブになります。 逆に下記コマンドを実行しないまま再起動してしまうと /dev/md127 などに割り当てられてしまい、 そのままの状態で使用していると不具合(エラーなど)が発生するとこがあります。 /etc/mdadm/mdadm.conf を編集したら、シャットダウンや再起動をする前に必ず実行するようにしてください。

# update-initramfs -u




目次へ




(4)ファイルシステムを構築(フォーマット)する

作成したRAIDデバイス /dev/md0 に対してLinuxファイルシステムを構築(フォーマット)します。
下記コマンドを実行して ext4 フォーマットを施します。

# mkfs -t ext4 /dev/md0


上記コマンドを実行すると、下記のようになります。

# mkfs -t ext4 /dev/md0
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 2930194432 4k blocks and 366276608 inodes
Filesystem UUID: 817c6a96-1018-4c1f-aa8b-264bee4df686
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632,
        2560000000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

root@raspi5-2:/home/muroi#


以上でフォーマット完了です。




目次へ




(5)HDD デバイス名を固定する

USB接続されたHDD デバイスは認識された順に /dev/sda, /dev/sdb などと自動で割り当てられてしまうため、 Raspberry Piを再起動した後に RAID が崩れる危険性があります。 そのため、各HDD デバイス名を固定するようにします。

HDD(正確にはUSB-SATA変換アダプタ)のデバイス情報を取得します。
udevadmコマンドを実行します。
まずは /dev/sda の情報を取得します。

# udevadm info -a -n /dev/sda

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

   looking at device '/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-1/1-1.4/1-1.4:1.0/host1/tar>
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
 
	~~ 省略 ~~

  looking at parent device '/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-1/1-1.4':
    KERNELS=="1-1.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"

	~~ 省略 ~~

    ATTRS{product}=="Ugreen Storage Device"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="20D11E800153"
    ATTRS{speed}=="480"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="2435578"
    ATTRS{version}==" 2.10"

	~~ 省略 ~~


次に /dev/sdb の情報を取得します。

# udevadm info -a -n /dev/sdb

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1/3-1.4/3-1.4:1.0/host2/tar>
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""

	~~ 省略 ~~

  looking at parent device '/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1/3-1.4':
    KERNELS=="3-1.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"

	~~ 省略 ~~

    ATTRS{product}=="Ugreen Storage Device"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="20D11E80005A"
    ATTRS{speed}=="480"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="2425026"
    ATTRS{version}==" 2.10"

	~~ 省略 ~~


ここで欲しい情報は、以下の通りです。

/dev/sda に関する情報
    SUBSYSTEMS=="usb"
    ATTRS{product}=="Ugreen Storage Device"
    ATTRS{serial}=="20D11E800153"

/dev/sdb に関する情報
    SUBSYSTEMS=="usb"
    ATTRS{product}=="Ugreen Storage Device"
    ATTRS{serial}=="20D11E80005A"


シリアル番号 ATTRS{serial} と製品名 ATTRS{product} を組み合わせれば、 それぞれのHDD(正確にはUSB-SATAアダプタ)を一意に特定できそうです。

・・・というわけで、 USB SSDのデバイス名の割り当てですが、

  /dev/sda のHDD(正確にはUSB-SATAアダプタ) → /dev/raid_01_001
  /dev/sdb のHDD(正確にはUSB-SATAアダプタ) → /dev/raid_01_002

に割り当てるように、ファイル
/etc/udev/rules.d/mdadmcheck.sh と、
/etc/udev/rules.d/10-local.rules を作成します。

# vi /etc/udev/rules.d/mdadmcheck.sh

mdadmcheck.sh

#!/bin/bash

if [ $# -ne 2 ]; then
        echo "Argument Error $#" 1&2

        exit 1
fi

DEVICE_COUNT=`ls $(echo $1) | wc -l`

echo $DEVICE_COUNT

if [[ ${DEVICE_COUNT} -eq $2 ]]; then
        echo 'OK'
        mdadm --assemble --scan
fi

exit 0


下記コマンドを実行して作成したファイル(スクリプト)に実行権限を付けます。

# chmod a+x /etc/udev/rules.d/mdadmcheck.sh



続いて /etc/udev/rules.d/10-local.rules を作成します。

# vi /etc/udev/rules.d/10-local.rules

/etc/udev/rules.d/10-local.rules

ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="Ugreen Storage Device", ATTRS{serial}=="20D11E800153", SYMLINK="raid_01_001%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"
ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="Ugreen Storage Device", ATTRS{serial}=="20D11E80005A", SYMLINK="raid_01_002%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"




目次へ




(6)RAID 0デバイスをマウント

RAID 0デバイス(/dev/md0)をマウントします。
マウントする前に対象となるデバイスを確認しましょう。

# fdisk -l

	・・・・・・

Disk /dev/sda: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: 003-2U9186
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 90F86802-68C1-42DA-93E6-90B396D738EC

Device     Start         End     Sectors  Size Type
/dev/sda1   2048 11721043967 11721041920  5.5T Linux RAID


Disk /dev/sdb: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: 003-2U9186
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 4A868FD2-29BD-4390-8DEC-21E0EE0987FF

Device     Start         End     Sectors  Size Type
/dev/sdb1   2048 11721043967 11721041920  5.5T Linux RAID


Disk /dev/md0: 10.92 TiB, 12002076393472 bytes, 23441555456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 32768 bytes / 65536 bytes


Disk /dev/sdc: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: DataTraveler Max
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbf83121c

Device     Boot   Start        End   Sectors   Size Id Type
/dev/sdc1          8192    1056767   1048576   512M  c W95 FAT32 (LBA)
/dev/sdc2       1056768 1000215215 999158448 476.4G 83 Linux
root@raspi5-2:/home/muroi#


/dev/md0 (10.92TiB) が表示されましたので大丈夫です。
続けてファイルシステムへマウントするために、まず既存のファイルシステムへマウントポイントを作ります。 ここでは /nas/hdd というマウントポイント(フォルダ)を作ることにします。

# cd /
# mkdir nas
# chmod 777 nas		※パーミッションは問題が出ない範囲で適当に変えてもらっても大丈夫です。
# cd nas
# mkdir hdd
# chmod 777 hdd		※パーミッションは問題が出ない範囲で適当に変えてもらっても大丈夫です。


続いて /etc/fstab ファイルへ下記の行を追加します。

/dev/md0 /nas/hdd ext4 nofail 0 2


完了したら、次のコマンドを実行してマウントしてみましょう。

# mount /dev/hdd


もし "systemctl daemon-reload" みたいなメッセージが表示されたようでしたら、 更に次のコマンドを実行してください。

# systemctl daemon-reload


完了したら、df -h コマンドを実行してマウントできたか確認してみましょう。

# df -h
ファイルシス               サイズ  使用  残り 使用% マウント位置
udev                         3.8G     0  3.8G    0% /dev
tmpfs                        805M  8.9M  797M    2% /run
/dev/sdc2                    469G  5.4G  440G    2% /
tmpfs                        4.0G  688K  4.0G    1% /dev/shm
tmpfs                        5.0M   64K  5.0M    2% /run/lock
/dev/sdc1                    510M   76M  435M   15% /boot/firmware
/dev/md0                      11T  645G  9.7T    7% /nas/hdd		← これ!
//192.168.11.2/disk1         1.9T  1.4T  442G   77% /nas/disk1
//192.168.11.2/disk1/music   1.9T  1.4T  442G   77% /nas/music
//192.168.11.2/disk1/画像    1.9T  1.4T  442G   77% /nas/picture/画像
tmpfs                        805M  176K  805M    1% /run/user/1000
root@raspi5-2:/home/muroi#


/dev/md0/nas/hdd にマウント(表示)されていれば一通り完了です。

最後に再起動して、RAID 0ドライブ(/dev/md0)が構成されてマウントされているかを確認しましょう。
df -h コマンドを実行して、上の結果と同じようにマウントされていれば成功です。


また下記のように ls -l /dev/raid* コマンドを実行して、 スクリプトなどで対策したファイルが作成されているかもチェックしておきましょう。

#  ls -l /dev/raid*
lrwxrwxrwx 1 root root  3  7月  7 01:45 /dev/raid_01_001 -> sda
lrwxrwxrwx 1 root root  3  7月  7 01:45 /dev/raid_01_0010 -> sg0
lrwxrwxrwx 1 root root  4  7月  7 01:45 /dev/raid_01_0011 -> sda1
lrwxrwxrwx 1 root root 15  7月  7 01:45 /dev/raid_01_0014 -> bus/usb/001/003
lrwxrwxrwx 1 root root  3  7月  7 01:45 /dev/raid_01_002 -> sdb
lrwxrwxrwx 1 root root 11  7月  7 01:45 /dev/raid_01_0020 -> bsg/2:0:0:0
lrwxrwxrwx 1 root root  4  7月  7 01:45 /dev/raid_01_0021 -> sdb1
lrwxrwxrwx 1 root root 15  7月  7 01:45 /dev/raid_01_0024 -> bus/usb/003/006
root@raspi5-2:/home/muroi#

上のような感じになっていれば大丈夫です。




目次へ




(7)キャッシュ設定

ラズパイに接続されているストレージデバイスすべてに影響するようですが、キャッシュ設定を適切に設定しないとI/Oエラーが発生することがあるようです。 もしI/Oエラーが発生したときには、キャッシュ設定も疑ってみましょう。

参考までに、現時点で私が使用しているキャッシュ設定を掲載しておきます。
下記の内容を /etc/sysctl.conf ファイルの最後に追加しています。

# NAS専用のため、メモリキャッシュ設定を適切にする
vm.dirty_background_ratio=4		# 10 (%) # バックグラウンドでフラッシュを開始する割合を指定
vm.dirty_ratio=12			# 20 (%) # キャッシュに使用する最大メモリの割合を指定
vm.dirty_writeback_centisecs=20		# 500 (×10ms)
vm.dirty_expire_centisecs=60		# 3000 (×10ms)


もし /etc/sysctl.conf ファイルでキャッシュ設定をするときには、 変更後(ファイルに追加・編集後)に下記コマンドを実行して設定を反映させましょう。

# sysctl -p


これでキャッシュ設定が反映されました。


2024/07/10 追記分
I/Oエラーが発生するのは250GB以上くらいの量のファイルを一括転送したときだけで、 それよりもずっと少ない量のファイル転送程度では今のところI/Oエラーが発生したことはありません。
2024/07/10 追記分
色々とキャッシュを変えて大量のファイル(総容量約1.4TB)のファイル転送を試みていたのですが、 どのようにキャッシュ設定を変えてもI/Oエラーは発生するようです。 過去に2回だけこのファイル転送に成功したことがあるのですが、おそらく【たまたま上手くいっただけ】のように思います。

色々キャッシュ設定を変えて実行してみて思ったことは、おそらくバッファオーバーフロー時の処理とバックグラウンドプロセスと フォアグラウンドプロセスの競合なんかが原因のように思いました。

そこで・・・というわけでもないのですが、これ(RAID)とは本来無関係なのですが、実は「ファイル転送プログラム」を作ろうと考えていました。 もし原因が「そう」であるなら、良いタイミングでキャッシュバッファのフラッシュ処理を入れてやれば良いように思います。 「キャッシュバッファのフラッシュ」とは具体的にどのような処理になるかはわかりませんが、上手く入れられれば問題は発生しないように思います。

・・・というわけで、ファイル転送プログラムを作って良い結果が得られたらホームページに掲載しようと思います。




目次へ




(8)RAID 0デバイスでI/Oエラーが発生したときの対処方法

私がこのデバイスを構成するにあたり、I/Oエラーが発生した原因はおそらく2つありまして、

  1. HDDに古い構成データが残っていて、不具合を引き起こしていたようなとき
  2. キャッシュ設定が良くなかったとき

です。 ただし、このページに記載してある手順通りにRAID 0ドライブを構成したのであれば、再構成させることは比較的簡単なはずです。 それは再起動を何回か繰り返すことです。 おそらく3~4回程度、再起動を繰り返すだけで復帰すると思います。 もし3~4回程度以上、再起動を繰り返しても復帰しないときは、

# systemctl daemon-reload

を、実行してみましょう。
これで復帰すると思います。
df -h コマンドでマウントされたかを確認してみましょう。
無事にマウントされたときは、一応再起動して復帰するかも確認しましょう。

万が一、再構成されないときは何かほかに重大な問題が発生している可能性があるかもしれません。
dmesgコマンドを実行して、エラーなどが発生していないか確認してみましょう。




目次へ




(9)自分のホームディレクトリへシンボリックリンク

RAID 0構成したデバイスを自分のホームディレクトリへシンボリックリンクする方法です。

RAID 0ドライブをマウントしたポイントは /nas/hdd でした。
ホームディレクトリは /home/muroi とします。
このとき、下記コマンドを実行するとホームディレクトリ (/home/muroi/) へシンボリックリンクできます。

$ sudo ln -s /nas/hdd /home/muroi


ただそれだけだとmuroiユーザーのままではアクセスできませんでした。
更に(下記の)chownコマンドを実行する必要がありました。

$ sudo chown muroi:muroi /home/muroi/hdd


ちなみにchownコマンドを実行後に ls -la コマンドを実行しても表示の上では /home/muroi/hdd フォルダはrootのままでmuroiには変わりませんでした。 しかし、ユーザーmuroiのままでも /home/muroi/hdd フォルダよりRAID 0デバイスへアクセスできるようになりました。

更にちなみにですが、シンボリックリンクを解除したいときには下記の unlink コマンドを実行してください。

$ unlink /home/muroi/hdd




目次へ




(10)最後に

ラズパイ5とHDDドライブ2台でRAID 0構成のNASを作ることができました。 今まで使用していた(これからもまだしばらくは使いますが)NASよりもずっと大容量で高速なものを作り上げることができました。 あとはどれくらい持つか・・・ですが、今回使ったHDDドライブは、すでに3年くらい経つでしょうか、 普通のHDDドライブとして使用していて何の不具合もまだ発生していないものと同じものを新品で2台用意したものなので、 おそらく悪くはない・・・といいますか、大丈夫だろう(数年くらいは持つだろう)と考えています。

現時点(2024/7/8現在)では、まだラズパイのGUIで【大量のファイルのコピー】を実行するとI/Oエラーが発生することがあります。 250GB以下くらいならI/Oエラーが発生したことは無いですが、それを超えると(280GBを超えてくると)エラーが発生することがありました。 現在コマンドライン(smbclientコマンド)で、大量のファイルのコピーができないか検証中です。 この辺については何か分かったら追記しようと思っています。


以上です。




目次へ






メニュー